File: /var/www/kevin-demo/wp-content/plugins/grocerslist/includes/Plugin.php
<?php
namespace GrocersList;
use GrocersList\Admin\AjaxController;
use GrocersList\Admin\CategoryGating;
use GrocersList\Admin\PageGating;
use GrocersList\Admin\PostGating;
use GrocersList\Admin\SalesPage;
use GrocersList\Admin\SettingsPage;
use GrocersList\Frontend\ClientScripts;
use GrocersList\Frontend\EmailVerificationPage;
use GrocersList\Frontend\PublicAjaxController;
use GrocersList\Frontend\WprmPrintIntegration;
use GrocersList\Service\CreatorSettingsFetcher;
use GrocersList\Service\MemberService;
use GrocersList\Service\LinkRewriter;
use GrocersList\Service\WpUserCleanupService;
use GrocersList\Support\ContentFilter;
use GrocersList\Support\ElevatedUserRemediation;
use GrocersList\Support\Logger;
use GrocersList\Support\SalesPagePattern;
class Plugin
{
private static bool $registered = false;
public function register(): void
{
if (defined('WP_DEBUG') && WP_DEBUG) {
Logger::enable();
} else {
Logger::disable();
}
if (self::$registered) {
Logger::debug('GrocersList\\Plugin::register() skipped, already registered.');
return;
}
// Run installer to check for database updates
require_once __DIR__ . '/Database/Installer.php';
Database\Installer::install();
// Register the hook for async migration
add_action('migration_visitor_run_async', ['\GrocersList\Jobs\MigrationVisitor', 'start']);
$creatorSettingsFetcher = new CreatorSettingsFetcher();
$memberService = new MemberService();
$linkRewriter = new LinkRewriter();
$linkRewriter->register();
$salesPagePattern = new SalesPagePattern($creatorSettingsFetcher);
$salesPage = new SalesPage($salesPagePattern);
$salesPage->register();
$ajaxController = new AjaxController($creatorSettingsFetcher, $salesPage);
$ajaxController->register();
$publicAjaxController = new PublicAjaxController();
$publicAjaxController->register($creatorSettingsFetcher, $memberService);
$emailVerificationPage = new EmailVerificationPage();
$emailVerificationPage->register();
// Hourly WP-Cron handler: poll GL server for churned followers and delete
// (or dissociate) their WordPress users locally.
$wpUserCleanupService = new WpUserCleanupService($creatorSettingsFetcher);
add_action('grocerslist_wp_user_cleanup', [$wpUserCleanupService, 'run']);
// Self-heal the cron schedule on every request. register_activation_hook
// fires only on click-to-activate; auto-updates from earlier plugin
// versions do NOT re-fire it, so existing installs that upgrade to this
// version would otherwise never get the cleanup cron scheduled. Cheap
// after the first schedule (wp_next_scheduled short-circuits).
add_action('init', function () {
if (!wp_next_scheduled('grocerslist_wp_user_cleanup')) {
wp_schedule_event(time(), 'hourly', 'grocerslist_wp_user_cleanup');
}
});
// UIs:
$settingsPage = new SettingsPage($creatorSettingsFetcher);
$settingsPage->register();
$clientScripts = new ClientScripts($creatorSettingsFetcher, $memberService);
$clientScripts->register();
$wprmPrintIntegration = new WprmPrintIntegration($creatorSettingsFetcher, $clientScripts);
$wprmPrintIntegration->register();
$contentFilter = new ContentFilter($creatorSettingsFetcher);
$contentFilter->register();
// Register post, page, and category gating components
$postGating = new PostGating();
$postGating->register();
$pageGating = new PageGating();
$pageGating->register();
$categoryGating = new CategoryGating();
$categoryGating->register();
$elevatedUserRemediation = new ElevatedUserRemediation();
$elevatedUserRemediation->register();
self::$registered = true;
}
}